package fr.bludwarf.skywarrior.global;

import fr.bludwarf.skywarrior.evenements.Evenement;
import fr.bludwarf.skywarrior.exceptions.ConstructionImpossible;
import fr.bludwarf.skywarrior.exceptions.EvenementInconnuOublie;

public abstract class Etat<T extends Entite> {
	
	protected T _entite;
	
	protected EtatPere _etatPere = null;
	
	/** La période qui précède cet état */
	Periode _periode = null;
	
	public Etat(final T entite, final EtatPere etatPere) {
		_entite = entite;
		_etatPere = etatPere;
	}
	
	/**
	 * Recopie
	 * @param etat
	 */
	protected Etat(final Etat<T> etat) {
		this._entite = etat._entite;
		this._etatPere = etat._etatPere;
	}
	
	/**
	 * Recopie
	 * @param etat
	 */
	protected Etat(final Etat<T> etat, final EtatPere etatPere) {
		this._entite = etat._entite;
		this._etatPere = etatPere;
	}

	public Temps getTemps() {
		return _etatPere.getTemps();
	}

	/**
	 * @return le prochain évènement qui arrivera
	 */
	public abstract Evenement prochainEvenement();
	
	/**
	 * Avance le temps d'un certains nombre de secondes.
	 * <b>Il ne doit surtout pas y avoir d'évènements pendant l'avance !</b>
	 * @param temps nombre de secondes à avancer
	 * @throws ConstructionImpossible 
	 * @throws EvenementInconnuOublie 
	 * @since 14 nov. 2011
	 */
	// FIXME:  le temps devrait être uniquement sur le monde
	public abstract void avancer(final double temps) throws ConstructionImpossible, EvenementInconnuOublie;
	
	public double tempsEcouleDepuis(final Etat<?> etat)
	{
		return Temps.tempsEcoule(getTemps(), etat.getTemps());
	}
}
